home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / c / recio202.zip / rcputf.c < prev    next >
C/C++ Source or Header  |  1994-05-05  |  3KB  |  92 lines

  1. /*****************************************************************************
  2.    MODULE: rcputf.c
  3.   PURPOSE: recio column delimited floating point output functions
  4. COPYRIGHT: (C) 1994 William Pierpoint
  5.  COMPILER: Borland C Version 3.1
  6.        OS: MSDOS Version 6.2
  7.   VERSION: 2.02
  8.   RELEASE: May 5, 1994
  9. *****************************************************************************/
  10.  
  11. #include <float.h>
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15.  
  16. #include "recio.h"
  17.  
  18. extern int _rstatus(REC *rp, int mode);
  19. extern int _rputc(REC *rp, int ch);
  20. extern char *dtoa(double d, int dig, char *str);
  21.  
  22. #define rfp(rp)          ((rp)->r_fp)
  23. #define rcol(rp)         ((rp)->r_colno)
  24. #define rfldch(rp)       ((rp)->r_fldch)
  25.  
  26. /****************************************************************************/
  27. static int                   /* return error status (0=no error, !0=error)  */
  28.     _rcputd(                 /* output flt pt number to col delim stream    */
  29.         REC   *rp,           /* pointer to record stream                    */
  30.         size_t begcol,       /* field inclusive beginning column            */
  31.         size_t endcol,       /* field inclusive ending column               */
  32.         int    sigdig,       /* number of significant digits                */
  33.         double num)          /* floating point number to put to stream      */
  34. /****************************************************************************/
  35. {
  36.     int err=EOF;             /* return error status (0=no error; !0=error) */
  37.     size_t sl;               /* length of string _r_nsbuf */
  38.     int dig;                 /* significant digits available */
  39.     if (!_rstatus(rp, R_WRITE)) { 
  40.       if (endcol >= begcol && begcol >= rcolno(rp)) { 
  41.         rfldno(rp)++; 
  42.         /* if colno < begcol, pad with spaces */
  43.         while (rcolno(rp) < begcol) { 
  44.           err = _rputc(rp, ' '); 
  45.           if (err) goto done; 
  46.         } 
  47.         dig = min(sigdig, (endcol-begcol+1)); 
  48.         while (dig > 0) { 
  49.           dtoa(num, dig, _r_nsbuf); 
  50.           sl = strlen(_r_nsbuf); 
  51.           if (sl <= (endcol-begcol+1)) { 
  52.             while (rcolno(rp) <= endcol-sl) { 
  53.               err = _rputc(rp, ' '); 
  54.               if (err) goto done; 
  55.             } 
  56.             err = fputs(_r_nsbuf, rfp(rp)); 
  57.             if (err==EOF) { 
  58.               rseterr(rp, R_ENOPUT); 
  59.             } else { 
  60.               rcol(rp) += sl; 
  61.               err = 0; 
  62.             } 
  63.             goto done; 
  64.           } 
  65.           dig -= sl-(endcol-begcol+1); 
  66.         } 
  67.         /* converted string too long for space */
  68.         rsetwarn(rp, R_WWIDTH); 
  69.         while (rcolno(rp) <= endcol) { 
  70.           err = _rputc(rp, '*'); 
  71.         } 
  72.       } else { 
  73.         rseterr(rp, R_EINVAL); 
  74.       } 
  75.     } 
  76. done:
  77.     return err; 
  78. }
  79.  
  80. /****************************************************************************/
  81. /* column delimited floating point output functions                         */
  82. /****************************************************************************/
  83. int rcputf(REC *rp, size_t begcol, size_t endcol, float num)
  84. {
  85.     return _rcputd(rp, begcol, endcol, FLT_DIG, (double) num);
  86. }
  87.  
  88. int rcputd(REC *rp, size_t begcol, size_t endcol, double num)
  89. {
  90.     return _rcputd(rp, begcol, endcol, DBL_DIG, num);
  91. }
  92.